import {
  ObjectOnlyPushSet,
  removeObjectOnlyPushSet,
} from '../../../../Func/uniFunc/Func/ObjectOnlyPushSet_operate';
import { normalizeContainer } from '../../../Func';
import {
  winStatic_staticCssTxt,
  winstatic_staticCssTxt_data,
} from '../DataDefine/sourceData';

const unit_staticCssTxt_manaTag = 'unit_staticCssTxt_mana';

const unit_prop_data = 'idArr';

class unit_staticCssTxt_mana {
  get [Symbol.toStringTag]() {
    return unit_staticCssTxt_manaTag;
  }

  /**
   * 命名空间 css Static Txt 处理目录
   */
  constructor() {}

  /**
   * 命名 空间
   * @type {string}
   */
  spacename;

  /**
   * 当前 类名下 创建的 css style 名称集
   * @type {string[]}
   */
  [unit_prop_data] = [];

  /**
   * 获取 id element
   * @param {string} id
   * @returns {HTMLElement | null}
   */
  getStaticCss_id_element(id) {
    id = this.get_accurateID(id);
    return normalizeContainer(id);
  }

  /**
   * 添加 一个 id 信息 和 相关 doc 元素
   * @param {String} id  -- accurate id(styleElement.id) = staticCssTxt_${this.spacename}_${id}
   * @param {String} cssTxt -- Packaged css  String = innerHtml
   * @param {boolean} strongCover -默认 false 非强覆盖  ||  true 强覆盖 重新 填充 css 信息
   */
  setStaticCssTxt(id, cssTxt, strongCover = false) {
    id = this.#accurateID(id);

    if (ObjectOnlyPushSet(this, id, cssTxt, unit_prop_data)) {
      // console.log(this);
      this.#createStaticElement(id);
      this.#activeToDoc(id, cssTxt);
      return true;
    }

    if (strongCover) {
      this[id] = cssTxt;
      this.#activeToDoc(id, cssTxt);
      return true;
    }
    return false;
  }

  /**
   * 移除 一个 id 信息 和 相关 doc 元素
   * @param {string} id
   */
  removeStaticCssTxt(id) {
    id = this.get_accurateID(id);

    if (removeObjectOnlyPushSet(this, id, true, unit_prop_data)) {
      let styleElement = normalizeContainer(id);
      styleElement.remove();
    }
  }

  /**
   * 移除 所有 记录信息
   */
  removeAll() {
    /**
     * @type {HTMLElement}
     */
    let styleElement;
    for (const unitKey_id of this[unit_prop_data]) {
      removeObjectOnlyPushSet(this, unitKey_id, true, unit_prop_data);

      styleElement = normalizeContainer(unitKey_id);
      styleElement.remove();
    }
  }

  get_accurateID(id) {
    let reg_staticCss_id = RegExp(`staticCssTxt_.*_${id}`);
    for (const unitKey_id of this[unit_prop_data]) {
      if (reg_staticCss_id.test(unitKey_id)) {
        return unitKey_id;
      }
    }
  }

  #accurateID(id) {
    return `staticCssTxt_${this.spacename}_${id}`;
  }

  /**
   * 创建 style 元素
   * @param {string} id
   */
  #createStaticElement(id) {
    let style = document.createElement('style');
    style.type = 'text/css';
    style.rel = 'stylesheet';
    style.setAttribute('id', `${id}`);

    var head = document.getElementsByTagName('head')[0];
    head.appendChild(style);
  }

  #activeToDoc(id, cssTxt) {
    let style = normalizeContainer(id);
    try {
      //for Chrome Firefox Opera Safari
      style.appendChild(document.createTextNode(cssTxt));
    } catch (err) {
      err;
      //for IE
      style.styleSheet.cssText = cssTxt;
    }
  }

  /**
   * 删除 window 上的 信息
   */
  destroy() {
    removeObjectOnlyPushSet(
      window[winStatic_staticCssTxt],
      this.spacename,
      true,
      winstatic_staticCssTxt_data
    );
  }
}

export { unit_staticCssTxt_mana };
